package com.waverider.promotion.model;

public class BaseQueryModel extends BaseModel {

	private static final long serialVersionUID = -7170937170337221913L;
	/**
	 * 默认的每页记录数,20条
	 */
	public static long DEFAULT_PAGE_SIZE = 10;
	public static final Long MAX_PAGE_SIZE = 2 * DEFAULT_PAGE_SIZE;
	/**
	 * 默认的当前页,第一页
	 */
	private static Long DEFAULT_CURRENT_PAGE = 1L;
	// 采用包装类型，方便出现null时取默认
	/**
	 * 每页记录数
	 */
	private Long pageSize;
	/**
	 * 当前页号
	 */
	private Long currentPage;
	/**
	 * 总记录数
	 */
	private int totalItem;
	/**
	 * 开始行
	 */
	private int startRow;
	/**
	 * 结束行
	 */
	private int endRow;

	/**
	 * 当前是否是第一页
	 * 
	 * @return 是否
	 */
	public boolean isFirstPage() {
		return getCurrentPage().intValue() == 1;
	}

	/**
	 * 获取上一页页号
	 * 
	 * @return 上一页页号
	 */
	public int getPreviousPage() {
		int back = getCurrentPage().intValue() - 1;
		return (back <= 0) ? 1 : back;
	}

	/**
	 * 当前是否是最后一页
	 * 
	 * @return
	 */
	public boolean isLastPage() {
		return getTotalPage() == getCurrentPage().intValue();
	}

	/**
	 * 获取下一页页号
	 * 
	 * @return 下一页页号
	 */
	public int getNextPage() {
		int back = getCurrentPage().intValue() + 1;
		return (back > getTotalPage()) ? getTotalPage() : back;
	}

	/**
	 * 取当前页号
	 * 
	 * @return 当前页号
	 */
	public Long getCurrentPage() {
		return (null == currentPage) ? DEFAULT_CURRENT_PAGE : currentPage;
	}

	/**
	 * 字符串方式设置当前页号
	 * 
	 * @param currentPage
	 */
	public void setCurrentPageString(String currentPage) {
		if (isBlankString(currentPage)) {
			setCurrentPage(DEFAULT_CURRENT_PAGE);
		} else {
			try {
				Long Long = new Long(currentPage);
				setCurrentPage(Long);
			} catch (NumberFormatException ignore) {
				setCurrentPage(DEFAULT_CURRENT_PAGE);
			}
		}
	}

	/**
	 * 设置当前页号
	 * 
	 * @param fPage
	 */
	public void setCurrentPage(Long fPage) {
		this.currentPage = ((null == fPage) || (fPage.intValue() <= 0)) ? null
				: fPage;
		// 设置开始与结束行
		setStartEndRow();
	}

	/**
	 * 获取每页记录数
	 * 
	 * @return
	 */
	public Long getPageSize() {
		return (null == pageSize) ? getDefaultPageSize() : pageSize;
	}

	/**
	 * 字符串方式设置每页记录数
	 * 
	 * @param pageSizeString
	 */
	public void setPageSizeString(String pageSizeString) {
		if (isBlankString(pageSizeString)) {
			setPageSize(getDefaultPageSize());
		} else {
			try {
				Long Long = new Long(pageSizeString);
				setPageSize(Long);
			} catch (NumberFormatException ignore) {
				setPageSize(getDefaultPageSize());
			}
		}
	}

	/**
	 * 设置开始与结束行
	 */
	private void setStartEndRow() {
		this.startRow = (getPageSize().intValue() * (getCurrentPage()
				.intValue() - 1));
		this.endRow = (this.startRow + getPageSize().intValue()) - 1;
	}

	/**
	 * 设置每页记录数
	 * 
	 * @param pSize
	 */
	public void setPageSize(Long pSize) {
		this.pageSize = ((null == pSize) || (pSize.intValue() <= 0)) ? null
				: pSize;
		// 设置开始与结束行
		setStartEndRow();
	}

	/**
	 * 是否是空串
	 * 
	 * @param string
	 * @return 是否
	 */
	private boolean isBlankString(String string) {
		boolean flag = false;
		flag = (string == null || string.trim().length() == 0);
		return flag;
	}

	/**
	 * 获取总记录数
	 * 
	 * @return 总记录数
	 */
	public int getTotalItem() {
		return totalItem;
	}

	/**
	 * 设置总记录数
	 * 
	 * @param tItem
	 */
	public void setTotalItem(int tItem) {
		this.totalItem = tItem;
		int currentPage = getCurrentPage().intValue();
		int totalPage = getTotalPage();
		// 当前页超过总页数,则取总页数
		if (currentPage > totalPage) {
			setCurrentPage(Long.valueOf(totalPage));
		}
	}

	/**
	 * 获取总页数
	 * 
	 * @return 总页数
	 */
	public int getTotalPage() {
		int pgSize = getPageSize().intValue();
		int result = 0;
		if (pgSize > 0) {
			result = totalItem / pgSize;
			if ((totalItem == 0) || ((totalItem % pgSize) != 0)) {
				result++;
			}
		}
		return result;
	}

	/**
	 * 计算开始行并返回
	 * 
	 * @return 开始行号
	 */
	public int getPageFirstItem() {
		int cPage = getCurrentPage().intValue();
		if (cPage == 1) {
			return 1; // 第一页开始当然是第 1 条记录
		}
		cPage--;
		int pgSize = getPageSize().intValue();
		return (pgSize * cPage) + 1;
	}

	/**
	 * 计算结束行并返回
	 * 
	 * @return 结束行号
	 */
	public int getPageLastItem() {
		int cPage = getCurrentPage().intValue();
		int pgSize = getPageSize().intValue();
		int assumeLast = pgSize * cPage;
		return (assumeLast > totalItem) ? totalItem : assumeLast;
	}

	/**
	 * 默认的每页记录数,子类可以重载
	 * 
	 * @return 每页记录数
	 */
	protected Long getDefaultPageSize() {
		return DEFAULT_PAGE_SIZE;
	}

	/**
	 * @return the startRow
	 */

	public int getStartRow() {
		return startRow;
	}

	/**
	 * @param startRow
	 *            the startRow to set
	 */
	public void setStartRow(int startRow) {
		this.startRow = startRow;
	}

	/**
	 * @return the endRow
	 */
	public int getEndRow() {
		return endRow;
	}

	/**
	 * @param endRow
	 *            the endRow to set
	 */
	public void setEndRow(int endRow) {
		this.endRow = endRow;
	}
}
